package pos.domain;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Utente implements Serializable{

    private HashSet<TipoLinkU_P> insieme_piani;
    private HashSet<TipoLinkDeveSostenere> insieme_corsi;
//    private HashSet<TipoLinkPossiede> insieme_mat_did;
    private HashSet<TipoLinkU_FO> insieme_operazioni;
//    private HashSet<TipoLinkSvolge> insieme_attivita;
    private String login;
    private String password;
    private long ultima_modifica;

    /**
     * NON usare. Costruttore Serializable
     */
    public Utente() {
    }

    public Utente(String login, String password, long u_m) {
        this.login = login;
        this.password = password;
        this.ultima_modifica = u_m;

        insieme_piani = new HashSet<TipoLinkU_P>();
        insieme_corsi = new HashSet<TipoLinkDeveSostenere>();
//        insieme_mat_did = new HashSet<TipoLinkPossiede>();
        insieme_operazioni = new HashSet<TipoLinkU_FO>();
//        insieme_attivita = new HashSet<TipoLinkSvolge>();
//        insieme_orari = new HashSet<Orario>();
    }

    //gestione delle associazioni
    //--- "Deve_sostenere"
    public void inserisciLinkDeveSostenere(TipoLinkDeveSostenere t) {
        if (t != null && t.getUtente() == this) {
            ManagerDeveSostenere.inserisci(t);
        }
    }

    public void eliminaLinkDeveSostenere(TipoLinkDeveSostenere t) {
        if (t != null && t.getUtente() == this) {
            ManagerDeveSostenere.elimina(t);
        }
    }

    public Set<TipoLinkDeveSostenere> getLinkDeveSostenere() {
        return (HashSet<TipoLinkDeveSostenere>) insieme_corsi.clone();
    }

    public void inserisciPerManagerDeveSostenere(ManagerDeveSostenere a) {
        if (a != null) {
            insieme_corsi.add(a.getLink());
        }
    }

    public void eliminaPerManagerDeveSostenere(ManagerDeveSostenere a) {
        if (a != null) {
            insieme_corsi.remove(a.getLink());
        }
    }
/*
    //--- "Possiede"
    public void inserisciLinkPossiede(TipoLinkPossiede t) {
        if (t != null && t.getUtente() == this) {
            ManagerPossiede.inserisci(t);
        }
    }

    public void eliminaLinkPossiede(TipoLinkPossiede t) {
        if (t != null && t.getUtente() == this) {
            ManagerPossiede.elimina(t);
        }
    }

    public Set<TipoLinkPossiede> getLinkPossiede() {
        return (HashSet<TipoLinkPossiede>) insieme_mat_did.clone();
    }

    public void inserisciPerManagerPossiede(ManagerPossiede a) {
        if (a != null) {
            insieme_mat_did.add(a.getLink());
        }
    }

    public void eliminaPerManagerPossiede(ManagerPossiede a) {
        if (a != null) {
            insieme_mat_did.remove(a.getLink());
        }
    }
*/
    // ---"F-U"
    public void inserisciLinkFU(TipoLinkU_FO t) {
        if (t != null && t.getUtente() == this) {
            ManagerFU.inserisci(t);
        }
    }

    public void eliminaLinkFU(TipoLinkU_FO t) {
        if (t != null && t.getUtente() == this) {
            ManagerFU.elimina(t);
        }
    }

    public Set<TipoLinkU_FO> getLinkFU() {
        return (HashSet<TipoLinkU_FO>) insieme_operazioni.clone();
    }

    public void inserisciPerManagerFU(ManagerFU a) {
        if (a != null) {
            insieme_operazioni.add(a.getLink());
        }
    }

    public void eliminaPerManagerFU(ManagerFU a) {
        if (a != null) {
            insieme_operazioni.remove(a.getLink());
        }
    }

// ---"Crea"
    public void inserisciLinkCrea(TipoLinkU_P t) {
        if (t != null && t.getUtente() == this) {
            ManagerCrea.inserisci(t);
        }
    }

    public void eliminaLinkCrea(TipoLinkU_P t) {
        if (t != null && t.getUtente() == this) {
            ManagerCrea.elimina(t);
        }
    }

    public Set<TipoLinkU_P> getLinkCrea() {
        return (HashSet<TipoLinkU_P>) insieme_piani.clone();
    }

    public void inserisciPerManagerCrea(ManagerCrea a) {
        if (a != null) {
            insieme_piani.add(a.getLink());
        }
    }

    public void eliminaPerManagerCrea(ManagerCrea a) {
        if (a != null) {
            insieme_piani.remove(a.getLink());
        }
    }
/*
//--- "Svolge"
    public void inserisciLinkSvolge(TipoLinkSvolge t) {
        if (t != null && t.getUtente() == this) {
            ManagerSvolge.inserisci(t);
        }
    }

    public void eliminaLinkSvolge(TipoLinkSvolge t) {
        if (t != null && t.getUtente() == this) {
            ManagerSvolge.elimina(t);
        }
    }

    public Set<TipoLinkSvolge> getLinkSvolge() {
        return (HashSet<TipoLinkSvolge>) insieme_attivita.clone();
    }

    public void inserisciPerManagerSvolge(ManagerSvolge a) {
        if (a != null) {
            insieme_attivita.add(a.getLink());
        }
    }

    public void eliminaPerManagerSvolge(ManagerSvolge a) {
        if (a != null) {
            insieme_attivita.remove(a.getLink());
        }
    }

    //---"U-O"
    public Set<Orario> getOrari() {
        return (HashSet<Orario>) insieme_orari.clone();
    }

    public void inserisciOrario(Orario o) {
        if (o != null) {
            insieme_orari.add(o);
        }
    }

    public void eliminaOrario(Orario o) {
        if (o != null) {
            insieme_orari.remove(o);
        }
    }
*/
    //funzioni set&&get
    public String getLogin() {
        return login;
    }

    public String getPassword() {
        return password;
    }

    public long getUltimaModifica() {
        return ultima_modifica;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUltimaModifica(long u_m) {
        this.ultima_modifica = u_m;
    }

    //funzioni ausiliarie 
    @Override
    public String toString() {
        return "Login: " + login;
    }
}
